﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Security.Cryptography;
using System.Threading;
using System.Net;
using System.Net.Mail;
using ASPSnippets.FaceBookAPI;
using Fabrikator;
using System.Web.Script.Serialization;
using FabrikatorDB;
using System.Text;
using System.IO;

namespace Fabrikatorum.Fabrikator.Sayfa
{
    public partial class Giris : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e){

            FaceBookConnect.API_Key = "206720549535952";
            FaceBookConnect.API_Secret = "5cc292c709f704afca8607ddd2921ec1";
            using (FabriDataContext db = new FabriDataContext())
            {
                if (!IsPostBack)
                {
                    if (Request.QueryString["logout"] == "true")
                    {
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Sistemden çıkış yaptınız')", true);
                        return;
                    }

                    if (Request.QueryString["error"] == "access_denied")
                    {
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Giriş izniniz yok!.')", true);
                        return;
                    }

                    string code = Request.QueryString["code"];
                    if (!string.IsNullOrEmpty(code))
                    {
                        Session["code"] = Request.QueryString["code"];
                        string data = FaceBookConnect.Fetch(code, "me");
                        FaceBookUser faceBookUser = new JavaScriptSerializer().Deserialize<FaceBookUser>(data);
                        faceBookUser.PictureUrl = string.Format("https://graph.facebook.com/{0}/picture", faceBookUser.Id);
                        //pnlFaceBookUser.Visible = true;
                        //lblId.Text = faceBookUser.Id;
                        //lblUserName.Text = faceBookUser.UserName;
                        //lblName.Text = faceBookUser.Name;
                        //lblEmail.Text = faceBookUser.Email;
                        //ProfileImage.ImageUrl = faceBookUser.PictureUrl;
                        //btnLogin.Enabled = false;
                        int cinsiyetine = 0;
                        if (faceBookUser.Gender == "female")
                        {
                            cinsiyetine = 2;
                        }
                        else
                        {
                            cinsiyetine = 1;
                        }
                        string kullaniciadi = faceBookUser.UserName;
                        string uyemailine = faceBookUser.Email;
                        string uyeadisoyadi = faceBookUser.Name;
                        int dogum = 0;
                        if (faceBookUser.Birthday == null)
                        {

                        }
                        else
                        {
                            string dogumtarih = faceBookUser.Birthday;
                            string tarih = dogumtarih.Substring(8, 4);
                            dogum = Convert.ToInt32(tarih);
                        }
                        string sfr = FormsAuthentication.HashPasswordForStoringInConfigFile(uyemailine, "MD5");
                        string onaykod1, onaykod2;
                        Random rastgele = new Random();
                        onaykod1 = System.DateTime.Now.Millisecond.ToString();
                        onaykod2 = rastgele.Next(1000, 99999999).ToString();
                        int? geciciuyeno = 0;
                        db.UyeEkle(uyeadisoyadi, sfr, uyemailine, kullaniciadi, cinsiyetine, dogum, onaykod1, onaykod2, ref geciciuyeno);
                        int geciciuye = Convert.ToInt32(geciciuyeno);
                        if (geciciuye == 0)
                        {
                            lblUyelikUyari.Text = "İstenmeyen bir hata oluştu. Lütfen tekrar deneyiniz!";
                            Uye girisyapan = (from k in db.Uyes where k.UyeMail == uyemailine & k.Aktiflik == 1 select k).FirstOrDefault();
                            if (girisyapan == null)
                            {
                                if (Request.Cookies["aytacfabrikatorum"] != null)
                                {
                                    Response.Cookies["aytacfabrikatorum"].Expires = DateTime.Now.AddDays(-1);//Cookie'yi expire edip siliyoruz.
                                }
                            }
                            else
                            {
                                Session["uye"] = girisyapan;
                                Session.Timeout = 120;
                                db.UyeGiris(girisyapan.UyeNo);
                                if (cbBeniHatirla.Checked)
                                {
                                    string cookemail = girisyapan.UyeMail;
                                    string cooksifre = girisyapan.UyeSifre;
                                    //          string cookuyeno = girisyapan.UyeNo.ToString();
                                    cookemail = Sifrele(cookemail, passPhrase);
                                    cooksifre = Sifrele(cooksifre, passPhrase);
                                    //          cookuyeno = Sifrele(cookuyeno, passPhrase);
                                    HttpCookie cookienesne = new HttpCookie("aytacfabrikatorum"); //Cookiekullaniciadi isminde bir Cookie oluşturduk.
                                    cookienesne["email"] = cookemail;  //cookienesne'sinin kullaniciadi değerine kullaniciaditxt bilgisini atıyoruz.
                                    cookienesne["sifre"] = cooksifre;
                                    //          cookienesne["uyeno"] = cookuyeno;
                                    cookienesne.HttpOnly = true;
                                    cookienesne.Expires = DateTime.Now.AddDays(7);  //Cookie'mizin ömrü 30 saniye olacak.
                                    Response.Cookies.Add(cookienesne);
                                }
                                Response.Redirect("~/Fabrikator/Default.aspx");
                            }
                        }
                        else
                        {
                            int? sonuc = 0;
                            db.UyeOnayla(onaykod1, onaykod2, ref sonuc);
                            Uye girisyapan = (from k in db.Uyes where k.UyeMail == uyemailine & k.Aktiflik == 1 select k).FirstOrDefault();
                            if (girisyapan == null)
                            {
                                if (Request.Cookies["aytacfabrikatorum"] != null)
                                {
                                    Response.Cookies["aytacfabrikatorum"].Expires = DateTime.Now.AddDays(-1);//Cookie'yi expire edip siliyoruz.
                                }
                            }
                            else
                            {
                                Session["uye"] = girisyapan;
                                Session.Timeout = 120;
                                db.UyeGiris(girisyapan.UyeNo);
                                if (cbBeniHatirla.Checked)
                                {
                                    string cookemail = girisyapan.UyeMail;
                                    string cooksifre = girisyapan.UyeSifre;
                                    //          string cookuyeno = girisyapan.UyeNo.ToString();
                                    cookemail = Sifrele(cookemail, passPhrase);
                                    cooksifre = Sifrele(cooksifre, passPhrase);
                                    //          cookuyeno = Sifrele(cookuyeno, passPhrase);
                                    HttpCookie cookienesne = new HttpCookie("aytacfabrikatorum"); //Cookiekullaniciadi isminde bir Cookie oluşturduk.
                                    cookienesne["email"] = cookemail;  //cookienesne'sinin kullaniciadi değerine kullaniciaditxt bilgisini atıyoruz.
                                    cookienesne["sifre"] = cooksifre;
                                    //          cookienesne["uyeno"] = cookuyeno;
                                    cookienesne.HttpOnly = true;
                                    cookienesne.Expires = DateTime.Now.AddDays(7);  //Cookie'mizin ömrü 30 saniye olacak.
                                    Response.Cookies.Add(cookienesne);
                                }
                                Response.Redirect("~/Fabrikator/Default.aspx");
                            }
                        }
                    }
                }
            }

            //if (Request.Cookies["maksitahmincom"] != null)
            //{
            //    Response.Cookies["maksitahmincom"].Expires = DateTime.Now.AddDays(-1);//Cookie'yi expire edip siliyoruz.
            ////    Response.Redirect("Default.aspx");  //Silme işleminden sonra ana sayfaya yönlendiriyoruz.
            //}
            if (Page.IsPostBack)
            {
                return;
            }

            //if (c != null)
            //{
            //    Response.Redirect(string.Format("Uye.aspx?k={0}&s={1}", c.Values["k"], c.Values["s"]));
            //}
            //try
            //{
                HttpCookie c = Request.Cookies["aytacfabrikatorum"];
            if (c != null)//Eğer sqlogren adında bir cookie varsa;
            {
                //Label1.Text = Request.Cookies["maksitahmincom"]["email"];//Sqlogren cookie'si içindeki isim değerini atıyoruz.Aşağıdakilerde aynı mantıkda
                //Label1.Text += Request.Cookies["maksitahmincom"]["sifre"];
                //Label1.Text += Request.Cookies["maksitahmincom"]["uyeno"];
                string cookemail = Request.Cookies["aytacfabrikatorum"]["email"];
                string cooksifre = Request.Cookies["aytacfabrikatorum"]["sifre"];
                //      string cookuyeno = Request.Cookies["maksitahmincom"]["uyeno"];
                cookemail = SifreCoz(cookemail, passPhrase);
                cooksifre = SifreCoz(cooksifre, passPhrase);
                //     cookuyeno = SifreCoz(cookuyeno, passPhrase);
                //txtEpostaGir.Text = cookemail;
                //txtSifreGir.Text = cooksifre;
                using (FabriDataContext db = new FabriDataContext())
                {
                    Uye girisyapan = (from k in db.Uyes where k.UyeMail == cookemail & k.UyeSifre == cooksifre & k.Aktiflik == 1 select k).FirstOrDefault();
                    if (girisyapan == null)
                    {
                        if (Request.Cookies["aytacfabrikatorum"] != null)
                        {
                            Response.Cookies["aytacfabrikatorum"].Expires = DateTime.Now.AddDays(-1);//Cookie'yi expire edip siliyoruz.
                        }
                    }
                    else
                    {
                        Session["uye"] = girisyapan;
                        Session.Timeout = 120;
                        db.UyeGiris(girisyapan.UyeNo);
                        Response.Redirect("~/Fabrikator/Default.aspx");
                    }
                }
            }
            //}
            //catch (Exception)
            //{
            //    Response.Cookies["aytacfabrikatorum"].Expires = DateTime.Now.AddDays(-1);
            //    Response.Redirect("GirisYap.aspx?Sayfa=GirisYap");
            //}

        }
        protected void Login(object sender, EventArgs e)
        {
            FaceBookConnect.Authorize("user_photos,email", Request.Url.AbsoluteUri.Split('?')[0]);
        }
        protected void Logout(object sender, EventArgs e)
        {
            FaceBookConnect.Logout(Request.QueryString["code"]);
            FaceBookConnect.Logout((string)Session["code"]);
        }
        // herhangi birşey olabilir
        private const string passPhrase = "fabrikatorumcom";


        // herhangi birşey olabilir
        private const string saltValue = "BiricikKaricimBenim";


        // SHA1 ya da MD5
        private const string hashAlgorithm = "SHA1";


        // herhangi bir sayı olabilir
        private const int passwordIterations = 2;


        // 16 byte olmalı
        private const string initVector = "@1B2c3Dq@5F6x7H8";


        // kaç bit şifreleme?
        private const int keySize = 256;

        private string Sifrele(string plainText, string Anahtar)
        {
            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

            PasswordDeriveBytes password = new PasswordDeriveBytes(Anahtar, saltValueBytes, hashAlgorithm, passwordIterations);

            byte[] keyBytes = password.GetBytes(keySize / 8);

            RijndaelManaged symmetricKey = new RijndaelManaged();

            symmetricKey.Mode = CipherMode.CBC;

            ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);

            MemoryStream memoryStream = new MemoryStream();

            CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

            cryptoStream.FlushFinalBlock();

            byte[] cipherTextBytes = memoryStream.ToArray();

            memoryStream.Close();
            cryptoStream.Close();

            string cipherText = Convert.ToBase64String(cipherTextBytes);

            return cipherText;
        }

        private string SifreCoz(string cipherText, string Anahtar)
        {
            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

            PasswordDeriveBytes password = new PasswordDeriveBytes(Anahtar, saltValueBytes, hashAlgorithm, passwordIterations);

            byte[] keyBytes = password.GetBytes(keySize / 8);

            RijndaelManaged symmetricKey = new RijndaelManaged();

            symmetricKey.Mode = CipherMode.CBC;

            ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);

            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

            CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

            byte[] plainTextBytes = new byte[cipherTextBytes.Length];

            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

            memoryStream.Close();
            cryptoStream.Close();

            string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);

            return plainText;
        }
        public class FaceBookUser
        {
            public string Id { get; set; }
            public string Name { get; set; }
            public string UserName { get; set; }
            public string PictureUrl { get; set; }
            public string Email { get; set; }
            public string Gender { get; set; }
            public string Birthday { get; set; }
        }
        protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
        {
            FaceBookConnect.Authorize("user_photos,email", Request.Url.AbsoluteUri.Split('?')[0]);
        }

        protected void btnUyeOl_Click(object sender, EventArgs e)
        {
            Yardimci sinif = new Yardimci();
      //      Sayisal sinif = new Sayisal();
            string temizsifre = sinif.KodTemizle(txtSifre.Text.Trim());
            string temizemail = sinif.KodTemizle(txtEposta.Text.Trim());
            string sfr = FormsAuthentication.HashPasswordForStoringInConfigFile(temizsifre, "MD5");
            string onaykod1, onaykod2;
            Random rastgele = new Random();
            onaykod1 = System.DateTime.Now.Millisecond.ToString();
            onaykod2 = rastgele.Next(1000, 99999999).ToString();
            int? geciciuyeno = 0;
            using (FabriDataContext db = new FabriDataContext())
            {
                db.UyeEkle(string.Empty, sfr, temizemail, string.Empty, 0, 0, onaykod1, onaykod2, ref geciciuyeno);
                int? sonuc = 0;
                db.UyeOnayla(onaykod1, onaykod2, ref sonuc);
                int geciciuye = Convert.ToInt32(geciciuyeno);
                if (geciciuye == 0)
                {
                    lblUyelikUyari.Text = "Bu bilgilere ait hesap mevcut, Lütfen başka bir e-posta adresi seçiniz";
                }
                //else
                //{
                //    Epostaci postaci = new Epostaci();
                //    string postahazirla = "Sayın Üye,<br>Üyelik işleminizin başarıyla tamamlanması için lütfen aşağıdaki linke tıklayarak üyelik işleminizi onaylayınız!<br>";
                //    string onaykod = string.Format("<a href=http://aytacsunar.com/MaksiTahmin/Hesabim.aspx?Islem=UyeOnay&kd1={0}&kd2={1}>Aktifleştirmek için tıklayın</a>", onaykod1, onaykod2);
                //    postahazirla += "Onay Linki:  " + onaykod;
                //    postaci.MailGonder(temizemail, "MaksiTahmin Uyelik Aktivasyon Maili", postahazirla, true);
                //    pnlGirisYapilmadi.Visible = false;
                //    pnlGirisYapildi.Visible = true;
                //    lblOnayUyarisi.Text = "Üyeliğiniz kaydedildi. Üyeliğiniz aktif edilmiştir! Lütfen giriş yapınız!";
                //}
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Thread.Sleep(1000);
            Yardimci sinif = new Yardimci();
       //     Sayisal sinif = new Sayisal();
            string temizsifre = sinif.KodTemizle(txtSifreGir.Text.Trim());
            string temizemail = sinif.KodTemizle(txtEpostaGir.Text.Trim());
            string sfr = FormsAuthentication.HashPasswordForStoringInConfigFile(temizsifre, "MD5");
            using (FabriDataContext db = new FabriDataContext())
            {
                Uye girisyapan = (from k in db.Uyes where k.UyeMail == temizemail & k.UyeSifre == sfr & k.Aktiflik == 1 select k).FirstOrDefault();
                if (girisyapan == null) lblGirisUyari.Text = "Hatalı giriş";
                else
                {
                    Session["uye"] = girisyapan;
                    Session.Timeout = 120;
                    db.UyeGiris(girisyapan.UyeNo);
                    if (cbBeniHatirla.Checked)
                    {
                        string cookemail = girisyapan.UyeMail;
                        string cooksifre = girisyapan.UyeSifre;
                        //          string cookuyeno = girisyapan.UyeNo.ToString();
                        cookemail = Sifrele(cookemail, passPhrase);
                        cooksifre = Sifrele(cooksifre, passPhrase);
                        //          cookuyeno = Sifrele(cookuyeno, passPhrase);
                        HttpCookie cookienesne = new HttpCookie("aytacfabrikatorum"); //Cookiekullaniciadi isminde bir Cookie oluşturduk.
                        cookienesne["email"] = cookemail;  //cookienesne'sinin kullaniciadi değerine kullaniciaditxt bilgisini atıyoruz.
                        cookienesne["sifre"] = cooksifre;
                        //          cookienesne["uyeno"] = cookuyeno;
                        cookienesne.HttpOnly = true;
                        cookienesne.Expires = DateTime.Now.AddDays(7);  //Cookie'mizin ömrü 30 saniye olacak.
                        Response.Cookies.Add(cookienesne);
                    }
                    Response.Redirect("~/Fabrikator/Default.aspx");
                }
            }
        }

    }
}